"""
先写出函数的功能，在提取代码重构，从而实现分而治之！
"""

#%% 实现函数功能

# 商品列表
shang_pin_info = {
    101:{'name': '屠龙刀', 'price': 10000},
    102:{'name': '倚天剑', 'price': 10000},
    103:{'name': '九阴白骨爪', 'price': 8000},
    104:{'name': '九阳神功', 'price': 9000},
    105:{'name': '降龙十八掌', 'price': 8000},
    106:{'name': '乾坤大挪移', 'price': 10000}
}

ding_dan = []

def gou_wu():
    """
    购物
    """
    while True:
        # 获取菜单选项
        item = input("1键购买，2键结算, 3键退出：")
        
        # 判断是否是指定的字符
        if item == "1":
            # 遍历字典，打印订单
            for key, value in shang_pin_info.items():
                print(f"编号：{key}, 名称：{value['name']}, 单价：{value['price']}")
                
            # 选择商品
            while True:
                cid = int(input("输入商品编号："))
                # 判断该商品编号是否在字典集合里, 如何在列表则跳出循环，追加到新的列表中
                if cid in shang_pin_info:
                    break
                else:
                    print("输入的商品不存在！")
                
            count = int(input("输入购买的数量："))
            order = {'cid': cid, 'count': count}
            ding_dan.append(order) # 将订单追加到列表中
            print("成功添加到购物车中。")
            
        elif item == "2":
            # 总价
            zong_jia = 0
            # 遍历订单列表
            for r in ding_dan:
                shang_pin = shang_pin_info[r['cid']]
                print(f"商品：{shang_pin['name']}, 单价：{shang_pin['price']}, 数量：{r['count']}")
                zong_jia += shang_pin['price'] * r['count']
            
            while True:
                qian = float(input(f"总价{zong_jia}元，请输入金额："))
                if qian >= zong_jia:
                    print(f"成功购买，找回{qian-zong_jia}元。")
                    ding_dan.clear() # 清空列表
                    break
                else:
                    print("余额不足！")
        
        elif item == '3':
            break
        else:
            print("输入的信息有误！重新输入。")
            break
        
# gou_wu()


#%% 代码提取重构

# 商品列表
shang_pin_info = {
    101:{'name': '屠龙刀', 'price': 10000},
    102:{'name': '倚天剑', 'price': 10000},
    103:{'name': '九阴白骨爪', 'price': 8000},
    104:{'name': '九阳神功', 'price': 9000},
    105:{'name': '降龙十八掌', 'price': 8000},
    106:{'name': '乾坤大挪移', 'price': 10000}
}

ding_dan = []

def gou_wu1():
    """
    购物
    """
    while True:
        # 获取菜单选项
        item = input("1键购买，2键结算, 3键退出：")
        
        # 判断是否是指定的字符
        if item == "1":
            # 遍历字典，打印订单
            print_order()
            
        elif item == "2":
            # 总价
            settlement()
        
        elif item == '3':
            break
        else:
            print("输入的信息有误！重新输入。")
            break

def settlement():
    """结算
    """
    # 遍历订单列表, 获取总价
    total_price = print_info()
    settle_accounts(total_price)

def settle_accounts(zong_jia):
    while True:
        qian = float(input(f"总价{zong_jia}元，请输入金额："))
        if qian >= zong_jia:
            print(f"成功购买，找回{qian-zong_jia}元。")
            ding_dan.clear() # 清空列表
            break
        else:
            print("余额不足！")

def print_info():
    # 总价
    total_price= 0
    for r in ding_dan:
        shang_pin = shang_pin_info[r['cid']]
        print(f"商品：{shang_pin['name']}, 单价：{shang_pin['price']}, 数量：{r['count']}")
        total_price += shang_pin['price'] * r['count']
    return total_price

# 打印商品及添加到购物车
def print_order():
    """打印商品
    """
    # 打印商品列表
    product_list()
                
    # 选择商品
    cid = select_goods()
    
    # 追加到购物车        
    order_list(cid)

def order_list(cid):
    count = int(input("输入购买的数量："))
    order = {'cid': cid, 'count': count}
    ding_dan.append(order) # 将订单追加到列表中
    print("成功添加到购物车中。")

def select_goods():
    while True:
        cid = int(input("输入商品编号："))
                # 判断该商品编号是否在字典集合里, 如何在列表则跳出循环，追加到新的列表中
        if cid in shang_pin_info:
            break
        else:
            print("输入的商品不存在！")
    return cid

def product_list():
    for key, value in shang_pin_info.items():
        print(f"编号：{key}, 名称：{value['name']}, 单价：{value['price']}")


gou_wu1()